在主机PC上安装TFTP服务器并检查设置
xmind@Ubuntu20:~$ sudo apt-get install tftpd-hpamind@Ubuntu20:~$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpaTFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure"在此环境中,服务器目录是/srv/tftp 。
由于此目录是只读的,因此将“--create”添加到TFTP_OPTIONS (如下所示)以使其可写
xxxxxxxxxxmind@Ubuntu20:~$ sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpaTFTP_USERNAME="tftp"TFTP_DIRECTORY="/srv/tftp"TFTP_ADDRESS=":69"TFTP_OPTIONS="--secure --create"
TFTP_USERNAME="tftp",它将以 tftp 权限执行。服务器目录具有 root 权限,因此切换到 tftp。此外,添加写入权限以放置 Petalinux 构建结果映像
xxxxxxxxxxmind@Ubuntu20:~$ ls -l /srvtotal 4drwxr-xr-x 2 root nogroup 4096 Dec 8 13:11 tftpmind@Ubuntu20:~$ sudo chown -R tftp /srv/tftpmind@Ubuntu20:~$ sudo chmod 777 /srv/tftpmind@Ubuntu20:~$ ls -l /srvtotal 4drwxrwxrwx 2 tftp nogroup 4096 Dec 8 13:11 tftp上述设置更改将通过重新启动服务器来反映
xxxxxxxxxxmind@Ubuntu20:~$ sudo service tftpd-hpa restartmind@Ubuntu20:~$ service tftpd-hpa status tftpd-hpa.service - LSB: HPA's tftp server Loaded: loaded (/etc/init.d/tftpd-hpa; generated) Active: active (running) since Mon 2025-08-25 13:55:37 CST; 43s ago Docs: man:systemd-sysv-generator(8) Process: 152053 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=> Tasks: 1 (limit: 6989) Memory: 244.0K CGroup: /system.slice/tftpd-hpa.service └─152063 /usr/sbin/in.tftpd --listen --user tftp --address :69 --s>lines 1-9/9 (END)
在Petalinux项目中执行系统配置
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-config
选择 Image Packaging Configuration ,然后将(/tftpboot) tftpboot 目录更改为 TFTP 服务器目录/srv/tftp ,根文件系统类型,可以选择INITRD或EXT4,我们这里选择的是EXT4
保存退出,然后运行petalinux-config -c u-boot配置 u-boot
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-config -c u-boot选择Command line interface-> Network commands->serverip variable takes precedent over DHCP server IP
保存并退出,此时已设置完成。执行build时,构建结果将放置在 TFTP 服务器目录中。
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-buildmind@Ubuntu20:/$ ls /srv/tftp/BOOT.BIN config pxelinux.cfg rootfs.cpio.gz rootfs.ext4 rootfs.manifest system.bit system.dts u-boot-dtb.bin u-boot.elf vmlinux zynq_fsbl.elfboot.scr image.ub rootfs.cpio rootfs.cpio.gz.u-boot rootfs.jffs2 rootfs.tar.gz system.dtb u-boot.bin u-boot-dtb.elf uImage zImage
按照以下步骤将 开发板 连接到电脑。步骤与之前基本相同,
将 SD 卡格式化为 FAT32 格式,也可以保留之前的分区配置 (FAT32+EXT4),只需删除其中的内容即可。
将 SD 卡安装到 开发板 中
使用 USB 线将 连接到 PC(Ubuntu)
将 开发板 的以太网端口连接到本地网络
打开开发板 电源
打开串口调试助手软件检查正在连接的端口
在 Ubuntu 上启动串行终端软件
在此状态下,没有引导加载程序,并且串行控制台上还没有任何输出。要通过 JTAG 启动,在主机 PC 上的 Petalinux 项目目录中运行以下命令:
xxxxxxxxxx#打卡vivado环境变量mind@Ubuntu20:~/petalinux_projects/petalinux-mind$ source /opt/pkg/Vivado/2021.1/settings64.sh#将hw_server进程作为守护进程放在后台mind@Ubuntu20:~/petalinux_projects/petalinux-mind$ hw_server -s tcp::3121 &
#此时hw_server已打开INFO: hw_server application startedINFO: Use Ctrl-C to exit hw_server application
INFO: To connect to this hw_server instance use url: TCP:Ubuntu20:3121
#将启动日志输出到串行控制台mind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121[INFO] Sourcing buildtoolsINFO: Launching XSDB for file download and boot.INFO: This may take a few minutes, depending on the size of your image.rlwrap: warning: your $TERM is 'xterm-256color' but rlwrap couldn't find it in the terminfo database. Expect some problems.: Inappropriate ioctl for deviceINFO: Downloading ELF file: /home/mind/petalinux_projects/petalinux-mind/images/linux/zynq_fsbl.elf to the target. INFO: Loading image: /home/mind/petalinux_projects/petalinux-mind/images/linux/system.dtb at 0x00100000 INFO: Downloading ELF file: /home/mind/petalinux_projects/petalinux-mind/images/linux/u-boot.elf to the target. INFO: SOC Silicon version is 3.1.这会将启动日志输出到串行控制台。
xxxxxxxxxx....DHCP client bound to address 192.168.3.193 (991 ms)*** ERROR: `serverip' not setCannot autoload with TFTPGETZynq>注:当输入petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121报错时,需要检查:
设置虚拟机的USB设备的兼容性为USB3.1
打开虚拟机里的用来检测 JTAG 接口的 Xilinx Mind
在此串行控制台上配置 u-boot 以进行 TFTP 启动。
xxxxxxxxxx#在虚拟机里获取ubuntu ipmind@Ubuntu20:/$ ifconfigenp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.157 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::1c4c:bc28:1b9a:bcd2 prefixlen 64 scopeid 0x20<link> ether 08:00:27:5e:09:4c txqueuelen 1000 (Ethernet) RX packets 172349 bytes 20517061 (20.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 59254 bytes 71921656 (71.9 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
xxxxxxxxxx#在串行控制台上设置服务器(主机PC)的IP地址Zynq> setenv serverip 192.168.3.157#在启动时,将执行以下操作#- 获取主板的 IP 地址(dhcp)#- 从服务器获取 pxe 启动设置(pxe get)#- 从服务器获取图像并执行(pxe boot)Zynq> dhcp;pxe get;pxe boot;设置已完成。重启开发板,然后再次运行petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121。Linux将启动,能够像之前一样登录。
由于dhcp;pxe get;pxe boot;此命令输完是通过DHCP自动分配 IP 地址导致有可能进入linux系统失败,所以可以在此步骤下设置主板IP,必须确保两边的IP地址一样。
xxxxxxxxxx#在串行控制台上设置主板的IP地址Zynq> setenv ipaddr 192.168.3.193现在可以使用 TFTP 通过网络启动 Petalinux。这样,每次自定义和运行petalinux-build时就无需将图像放置在 SD 卡上。需要对 开发板进行电源循环。
但是,使用此方法,每次启动时都会提取并使用rootfs.cpio.gz.u-boot,并且所做的任何编辑都不会在 Linux 启动后保存。
如果将rootfs设置为位于SD卡的ROOT分区,则编辑的结果将保存在SD卡上。
可以使用 NFS 解决此问题(参见下一部分):
在主机PC上安装NFS服务器并创建服务器目录。该目录可以是任何位置。这里我们将使用/srv/nfs 。
xxxxxxxxxxmind@Ubuntu20:~$ sudo apt install nfs-kernel-servermind@Ubuntu20:~$ sudo mkdir /srv/nfsmind@Ubuntu20:~$ ls -l /srv/total 8drwxr-xr-x 2 root root 4096 8月 25 10:07 nfsdrwxrwxrwx 3 tftp nogroup 4096 8月 22 16:20 tftp
接下来,设置从 NFS 客户端连接的权限。将以下内容添加到/etc/exports的末尾。
xxxxxxxxxxmind@Ubuntu20:~$ sudo vi /etc/exports#添加的内容##1. /srv/nfs:NFS 服务器目录路径#2. 192.168.3.193:客户端(开发板)的 IP 地址#3. 括号中:选项#/srv/nfs 192.168.3.193(rw,sync,no_root_squash,no_subtree_check)上述设置更改将通过重新启动服务器来反映。
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ sudo service nfs-server restartmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ service nfs-server status nfs-server.service - NFS server and services Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled) Active: active (exited) since Tue 2025-08-26 10:28:14 CST; 10s ago Process: 283269 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS) Process: 283270 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)在上面配置TFTP的基础上进行
检查 NFS 服务器(主机 PC)支持的版本。
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ sudo cat /proc/fs/nfsd/versions-2 +3 +4 +4.1 +4.2运行petalinux-config ,选择 Image Packaging Configuration,并将 Root filesystem type 更改为 NFS。将 Location of NFS root directory更改为 NFS 服务器目录/srv/nfs 。
保存并退出,然后运行petalinux-config -c kernel ,File systems -> Network File Systems使能以下内容:
NFS 4.1在NFS 4 使能后显示,NFS 4.2在NFS 4.1 使能后显示
前往 Networking support -> Networking options并启用以下选项。所有选项默认启用。
保存并退出。由于根文件系统更改为 NFS,因此引导参数将会改变。
构建设备树来查看变化:其中包含与 NFS 相关的信息。
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ petalinux-build -c device-tree[INFO] Sourcing buildtools[INFO] Building device-tree[INFO] Sourcing build environment[INFO] Generating workspace directoryINFO: bitbake virtual/dtb...NOTE: Executing TasksNOTE: Tasks Summary: Attempted 748 tasks of which 729 didn't need to be rerun and all succeeded.INFO: Successfully copied built images to tftp dir: /srv/tftp[INFO] Successfully built device-tree
mind@Ubuntu20:~/petalinux_projects/petalinux-mind$ cat components/plnx_workspace/device-tree/device-tree/system-conf.dtsi .../ { chosen { bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.3.157:/srv/nfs,tcp ip=dhcp rw"; stdout-path = "serial0:115200n8"; };};...
还需要指定要使用哪个 NFS 版本。将选择的内容复制到system-user.dtsi并添加想要使用的 NFS 版本,此处我们使用4.2版本,在tcp后添加nfsvers=4.2
xxxxxxxxxxmind@Ubuntu20:~/petalinux_projects/petalinux-mind$ vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi/include/ "system-conf.dtsi"/ { chosen { bootargs = "console=ttyPS0,115200 earlycon root=/dev/nfs nfsroot=192.168.3.157:/srv/nfs,tcp,nfsvers=4.2 ip=dhcp rw"; stdout-path = "serial0:115200n8"; };};
现在配置已完成。运行petalinux-build 。
将 rootfs 提取到 NFS 服务器目录。
xxxxxxxxxx$ sudo tar xf images/linux/rootfs.tar.gz -C /srv/nfs/同样,按照使用TFTP启动Petalinux的步骤,通过虚拟机启动串行控制台
如果先前的环境变量设置已保存,TFTP 启动将继续进行。在下面的倒计时结束之前,在串行控制台上输入任意键即可停止自动启动。
xxxxxxxxxxHit any key to stop autoboot: 0Zynq>配置server IP(host IP)和启动命令
xxxxxxxxxx#在串行控制台上设置服务器(主机PC)的IP地址Zynq> setenv serverip 192.168.3.157#在启动时,将执行以下操作#- 获取主板的 IP 地址(dhcp)#- 从 TFTP 服务器获取 Fit 映像(image.ub)并将其放在 0x10000000(tftpboot 0x10000000 image.ub)#- 指定映像(地址)并启动 Linux(bootm 0x10000000)Zynq> setenv bootcmd "dhcp;tftpboot 0x10000000 image.ub;bootm 0x10000000;"配置已完成。重启开发板并运行petalinux-boot --jtag --u-boot --fpga --hw_server-url TCP:Ubuntu20:3121。Linux将启动,能够像之前一样登录。
由于 rootfs 位于主机 PC 上,因此每次重新启动主板时编辑的内容都不会丢失。